import os # os: 用于处理文件路径和目录操作
import typing # typing: 提供类型提示，增强代码的可读性和可靠性。
from pydantic_settings import BaseSettings # BaseSettings: Pydantic 提供的基类，用于处理应用的配置加载和验证。
class Settings(BaseSettings):# 定义了 Settings 类继承自 BaseSettings，可以通过环境变量或 .env 文件动态加载配置。
    VERSION: str = "0.1.0" # VERSION: 应用的版本号。
    APP_TITLE: str = "Vue FastAPI Admin" # APP_TITLE: 应用的标题。
    PROJECT_NAME: str = "Vue FastAPI Admin" # PROJECT_NAME: 项目的名称。
    APP_DESCRIPTION: str = "Description" # APP_DESCRIPTION: 应用的描述。
    # CORS 配置
    CORS_ORIGINS: typing.List = ["*"]  # CORS_ORIGINS: 允许访问的域名列表，["*"] 表示允许所有。
    CORS_ALLOW_CREDENTIALS: bool = True  # CORS_ALLOW_CREDENTIALS: 是否允许携带凭据（如 cookies）。
    CORS_ALLOW_METHODS: typing.List = ["*"]  # CORS_ALLOW_METHODS: 允许的 HTTP 方法。
    CORS_ALLOW_HEADERS: typing.List = ["*"]  # CORS_ALLOW_HEADERS: 允许的 HTTP 头部。

    # PROJECT_ROOT: 获取项目根目录。
    PROJECT_ROOT: str = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
    # BASE_DIR: 基于项目根目录的上级路径。
    BASE_DIR: str = os.path.abspath(os.path.join(PROJECT_ROOT, os.pardir))
    # LOGS_ROOT: 日志文件存储路径。
    LOGS_ROOT: str = os.path.join(BASE_DIR, "app/logs")

    # SECRET_KEY: 用于生成加密签名的密钥。
    SECRET_KEY: str = "3488a63e1765035d386f05409663f55c83bfae3b3c61a932744b20ad14244dcf"  # openssl rand -hex 32
    # JWT_ALGORITHM: JWT（JSON Web Token）签名算法。
    JWT_ALGORITHM: str = "HS256"
    # JWT_ACCESS_TOKEN_EXPIRE_MINUTES: 访问令牌的过期时间（单位为分钟）。
    JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 7  # 7 day

    # Token相关参数
    TOKEN_PREFIX: str = 'access_token:'
    TOKEN_EXPIRE: int = 60 * 60 * 24 * 7
    TOKEN_SECRET: str = '3488a63e1765035d386f05409663f55c83bfae3b3c61a932744b20ad14244dcf'

    # 数据库MySQL的配置
    MYSQL_USER: str = "root"
    MYSQL_PASSWORD: str = "root"
    MYSQL_HOST: str = "localhost"
    MYSQL_PORT: int = 3306
    MYSQL_DB: str = "AIAgentDB"

    # Redis 配置
    REDIS_HOST: str = "localhost"
    REDIS_PORT: int = 6379

    # ✅ 使用 SQLite 数据库路径（建议将数据库放到根目录）
    SQLITE_DB_NAME: str = "app.db"  # 文件名
    SQLITE_DB_PATH: str = os.path.join(BASE_DIR, SQLITE_DB_NAME)  # 完整路径

    OCRPatch_MODEL_PATH: str = os.path.abspath(os.path.join(BASE_DIR, "ckpt"))

    @property
    def database_url(self):# 异步MySQL数据库
        return f"mysql+aiomysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}"

    @property
    def mysql_sync_url(self):# 同步MySQL数据库
        return f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}"

    @property
    def sqlite_url(self):
        path = self.SQLITE_DB_PATH.replace("\\", "/")
        return f"sqlite+aiosqlite:///{path}"  # 异步

    @property
    def sqlite_sync_url(self):
        path = self.SQLITE_DB_PATH.replace("\\", "/")
        return f"sqlite:///{path}"  # 同步

    @property
    def redis_url(self):
        return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}"

    class Config:
        env_file = ".env"

    #### 设置一个本地ollama的模型用于代码的测试
    OLLAMAMODEL : str = "gemma3:1b"
    OLLAMABASEURL : str = "http://localhost:11434"

# 实例化 Settings
Settings = Settings()